﻿// BJWC 2009, 取石子游戏.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
http://oj.daimayuan.top/course/30/problem/1239

小H和小Z正在玩一个取石子游戏。取石子游戏的规则是这样的，每个人每次可以从一堆石子中取出若干个石子，每次取石子的个数有限制，谁不能取石子时就会输掉游戏。 小H先进行操作，他想问你他是否有必胜策略，如果有，第一步如何取石子。

输入格式
第一行一个整数 n(n≤10)
，表示石子堆数。

接下来 n
 行，每行一个数 ai(ai≤1000)
，表示每堆石子的个数。

接下来一行，一个整数 m(m≤10)
，表示每次取石子个数的种类数。

接下来 m
 行，每行一个数 bi(bi≤10)
，表示每次可以取的石子个数，保证这 m
 个数按照递增顺序排列。

输出格式
第一行为YES或者NO，表示小H是否有必胜策略。

若结果为YES,则第二行包含两个数，第一个数表示从哪堆石子取，第二个数表示取多少个石子。若有多种答案，取第一个数最小的答案。若仍有多种答案，取第二个数最小的答案。

样例输入
4
7
6
9
3
2
1
2
样例输出
YES
1 1
*/

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <set>

using namespace std;


typedef long long ll;

const int N = 1010;
int n, m, a[N], b[N], sg[N];

int main()
{
	scanf("%d",&n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	scanf("%d",&m);
	for (int i = 1; i <= m; i++) {
		scanf("%d", &b[i]);
	}
	for (int i = 1; i <= 1000; i++) {
		set<int> s;
		for (int j = 1; j <= m; j++) {
			if (i >= b[j]) s.insert(sg[i - b[j]]);
		}
		while (s.count(sg[i])) sg[i]++;
	}

	int ans = 0;
	for (int i = 1; i <= n; i++)
		ans ^= sg[a[i]];
	if (ans) {
		puts("YES");
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				if (a[i] >= b[j]) {
					if (0 == (ans ^ sg[a[i]] ^ sg[a[i] - b[j]])) {
						printf("%d %d\n",i,b[j]);
						return 0;
					 }
				}
			}
		}
	}
	else {
		puts("NO");
	}

}

 